/* 
  df：简单一点的请求封装，后续再考虑使用vben的axios封装
*/

import axios from 'axios';
// import { message } from 'ant-design-vue';
// import { getAppEnvConfig } from '/@/utils/env';
import { message } from 'antd';
import { getToken } from './auth'
import AppRouter from '../router'

const service = axios.create({
  // baseURL: "/", //永远不要配置, 不同路径应该有不同的封装
  // timeout: 60000,
  withCredentials: true,
});

const whiteList = ['login', 'swapToken'];
// 拦截请求
service.interceptors.request.use(
  (config) => {
    const url = config.url;
    const token = getToken();
    if (token) {
      config.headers['Authorization'] = token;
    } else {
      AppRouter.navigate('/login')
    }
    // const isWhiteUrl = whiteList.find((val) => url.indexOf(val) !== -1);
    // if (!isWhiteUrl) {
    //   const token = getToken();
    //   if (token) {
    //     config.headers['auth_token'] = token;
    //   } else {
    //     message.error('token丢失');
    //     const userStore = useUserStoreWithOut();
    //     userStore.logoutByInvalid();
    //   }
    // }
    return config;
  },
  (error) => {
    // console.log(error);
    return Promise.reject(error);
  },
);

/**
 * 拦截响应
 *
 * 如果业务代码中想自己处理原始返回，可以：
 *    自己处理http响应: config中传递 resGiveToMeHttp: true
 *    自己处理数据响应: config中传递 resGiveToMeData: true
 *    自己处理http error响应: config中传递 resGiveToMeHttpError: true
 *    不传递：默认由拦截器统一处理, 与后端保持一致性
 */
service.interceptors.response.use(
  // 响应成功进入第1个函数，该函数的参数是响应对象
  (response) => {
    // console.log(response, 'response')
    const { data, config } = response;
    const { code, msg } = data;

    if (config.resGiveToMeHttp) {
      return response;
    }

    if (config.resGiveToMeData) {
      return data;
    }
    if (code === 200 || code === '200') {
      return data;
    }
    if (code === 1 || code === '1') {
       message.error(response.data.message);
      return data;
    }
    // message.error(msg || '未定义错误');
    return Promise.reject(response);
  },
  // 响应失败进入第2个函数，该函数的参数是错误对象
  async (error) => {
    // message.destroy();
    console.log('接口异常错误', error);
    const errRes = error.response;

    const { status, data, config } = errRes;
    console.log(status, 'status', config)
    if (config.resGiveToMeHttpError) {
      return error;
    }

    if (status === 401) {
      // message.warning(`登录失效, 请重新登录`);
      localStorage.clear();
      AppRouter.navigate('/login')
    } else {
      // message.error(`${status}: ${data.msg || data.message || data.error}`);
    }
    return Promise.reject(error);
  },
);

// const { VITE_GLOB_PROXY_URL_MOCK_CRUD, VITE_GLOB_PROXY_URL_APP_BASE_API } = getAppEnvConfig();

// // 测试mock接口统一修改前缀
// export function mockRequest(params, ...args) {
//   if (params.url) {
//     params.url = VITE_GLOB_PROXY_URL_MOCK_CRUD + params.url;
//     return service(params, ...args);
//   } else {
//     console.log('mockRequest', '未传递请求url');
//   }
// }

export const crudUrlPath = {
  list: '/page',
  edit: '/update',
  del: '/delete',
  add: '/add',
};

// 真实接口使用  数据空间 指标平台
export default function apiService(params, ...args) {
  if (params.url) {
    params.url = params.url;
    return service(params, ...args);
  } else {
    console.log('apiRequest', '未传递请求url');
  }
}
